/************************************************/
/************ Desenvolvido por: *****************/
/********** Lucas de Souza Sales ****************/
/************************************************/
package br.com.eres.control;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.*;
import android.database.Cursor;
import android.database.SQLException;

public class Banco{
	
		private static SQLiteDatabase bd = null;
		
		private static String _nomeBanco = "SCC";
		
		private static int _versaoBanco = 4;     
		
		private BancoDados bdados;
		
		private final Context ctx;
		  
		public static final String[] _sqlTabelaWS = new String[] {"CREATE TABLE if not exists webservice (_ID integer PRIMARY KEY autoincrement NOT NULL,"+
																  "WS_URL text NOT NULL, " +
																  "WS_PORTA text NOT NULL," +
																  "WS_USUARIO text NOT NULL," +
																  "WS_IDAPARELHO text NOT NULL," +
																  "WS_TEMPO_REQUISICAO text NOT NULL," +
																  "WS_REQUISICAO_AUTO text NOT NULL," +
																  "WS_FINISH_AUTO text NOT NULL," +
																  "WS_TEMPO_AVISO text NOT NULL );"};
		
		public static final String[] _sqlTabelaProduto =  new String[] {"CREATE TABLE if not exists produtos (_ID integer PRIMARY KEY autoincrement NOT NULL,"+
																		"COD_RET text NOT NULL,             "+
																		"DESCRICAO text NOT NULL,           "+
																		"QTD_MINIMA text DEFAULT '1',       "+
																		"MULTIPLICADOR text DEFAULT '1',  	"+
																		"PRECO text,			            "+
																		"SALDO text,						"+
																		"SUSPENSO text );                   "};	
		
		public static final String[] _sqlTabelaUsuario =  new String[] {"CREATE TABLE if not exists usuarios (_ID integer PRIMARY KEY autoincrement NOT NULL,"+
																		"USU_MATRICULA text NOT NULL,      "+
																		"USU_NOME text NOT NULL,           "+
																		"USU_LOGIN text NOT NULL,          "+
																		"USU_SENHA text NOT NULL,      	   "+
																		"USU_COORDENADOR text,			   "+
																		"USU_ATIVO text NOT NULL,          "+
																		"USU_FL_ADMIN integer NOT NULL);   "};		
		
		public static final String[] _sqlTabelaSessao =  new String[] {"CREATE TABLE if not exists sessao (_ID integer PRIMARY KEY autoincrement NOT NULL,"+
																	   "SESSAO text,  	           "+
																	   "USU_NOME text,             "+
																	   "ULTIMO_USU_LOGADO text,    "+
																	   "PER_CANCELA_ITEM text,     "+ 
																	   "PER_TRANS_ITEM text,       "+ 
																	   "USU_SENHA text,            "+
																	   "DATA text );			   "};
		
		public static final String[] _sqlTabelaUsuarioAux =  new String[] {"CREATE TABLE if not exists usuariosAux (_ID integer PRIMARY KEY autoincrement NOT NULL,"+
																		   "USU_NOME text NOT NULL);"};				   														
		
		private static final String _sqlTabelaVersao = "create table versao (_id integer primary key autoincrement, "+
				 									   "nometabela text not null, versao integer not null);";
		
		private static final String _nomeTabelaVersao= "versao";
		
		/**campos para a tabela versao**/ 
		public static final String CHAVE = "_id";
		private static final String NOMETABELA = "nometabela";
		private static final String VERSAOTABELA = "versao";
		private static final String[] _colunas = { Banco.CHAVE, Banco.NOMETABELA, Banco.VERSAOTABELA };
	
		
	public static class BancoDados extends SQLiteOpenHelper{	
		
			//instancia unica do dao
			private static BancoDados _instDAO;

			private BancoDados(Context context) {
				super(context, _nomeBanco, null, _versaoBanco);
			}	
			
			public static BancoDados getDAO(Context ctx, String[] scriptSql,
					String nomeTabela) {
				if  (_instDAO == null) {
					_instDAO = new BancoDados(ctx);
					try {
						bd = _instDAO.getWritableDatabase();
					} catch (SQLiteException e) {
						e.printStackTrace();
					}
		
				}
				// verifica a quantidade de script para executar no banco de dados da tabela
				Cursor _cursor = null;
				_cursor = _instDAO.selecionar(_nomeTabelaVersao, _colunas, Banco.NOMETABELA
						+ "= ?", new String[] { nomeTabela }, null, null, null, null);
		
				if (_cursor.getCount() > 0) {
					_cursor.moveToFirst();
					int _versaoTabela = _cursor.getInt(2);
					int qtdeScript = scriptSql.length;
					for (int i = _versaoTabela; i < qtdeScript; i++) {
						String sql = scriptSql[i];
						bd.execSQL(sql);
					}
					//atualiza a versao da tabela
					ContentValues _valores = new ContentValues();
					_valores.put(Banco.VERSAOTABELA, qtdeScript);
					_instDAO.atualizarDadosTabela(_nomeTabelaVersao, _cursor.getInt(0), _valores);
		
				} else {
					//cria uma linha na tabela versao caso nao exista com o nome da tabela
					ContentValues _valores = new ContentValues();
					_valores.put(Banco.NOMETABELA, nomeTabela);
					_valores.put(Banco.VERSAOTABELA, 1);
					_instDAO.inserirRegistro("versao", _valores);
		
					//executa o script 0 da tabela
					String sql = scriptSql[0];
					bd.execSQL(sql);
				}
				_cursor.close();
				return _instDAO;
			}
			
			private Cursor selecionar(String table, String[] columns, String where,
					String[] argumentosWhere, String groupby, String having,
					String orderby, String limit) {
				return bd.query(table, columns, where, argumentosWhere, groupby,
						having, orderby, limit);
			}
			
			//atualiza uma linha de uma tabela
			public int atualizarDadosTabela(String tabela, long id,
					ContentValues valores) {
				return bd.update(tabela, valores, CHAVE + "=" + id, null);
			}	
			
			public long inserirRegistro(String tabela, ContentValues valores) {
				return bd.insert(tabela, null, valores);
				
			}
		
			@Override
			public void onCreate(SQLiteDatabase bd) {
				
				try{
					bd.execSQL(_sqlTabelaVersao);
				}catch(SQLException e){
					//
				}
			}
		
			@Override
			public void onUpgrade(SQLiteDatabase bd, int versaoAntiga, int versaoNova) {
				bd.execSQL("DROP TABLE IF EXISTS usuarios");
				bd.execSQL("DROP TABLE IF EXISTS usuariosAux");	
				bd.execSQL("DROP TABLE IF EXISTS versao");
				bd.execSQL("DROP TABLE IF EXISTS webservice");
				bd.execSQL("DROP TABLE IF EXISTS produtos");
				bd.execSQL("DROP TABLE IF EXISTS sessao");
				onCreate(bd);				
			}
			
	}
	
	public Banco(Context c){
		this.ctx = c;
	}
	
	public Banco open(){
		bdados = new BancoDados(ctx);		
		bd = bdados.getWritableDatabase();
		return this;
	}
	
	
	public void fechaBanco(){
		if (bd.isOpen()){
			bdados.close();
		}
	}
	
	public long inserirRegistro(String tabela, ContentValues valores) {
		return bd.insert(tabela, null, valores);
		
	}
	
	public boolean ExecutaSql(String Sql){
		try{
			open();
			bd.execSQL(Sql);
			return true;
		}catch(Exception e){
			return false;
		}
	}
	
	public Cursor consulta(String table, String[] columns, String where, String[] argumentosWhere, String groupby, String having, String orderby, String limit) {
		return bd.query(table, columns, where, argumentosWhere, groupby, having, orderby, limit);
	}

	public int atualizarDadosTabela(String tabela, long id,	ContentValues valores) {
		return bd.update(tabela, valores, CHAVE + "=" + id, null);
	}
	
	
}
